package com.weactivity.interceptor;


import cn.hutool.core.util.StrUtil;
import com.weactivity.dto.UserDTO;
import com.weactivity.utils.JwtUtil;
import com.weactivity.utils.UserHolder;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 刷新token
 *为什么要刷新
 * 因为之前在登录的时候设置的token的有效值是30m
 * 如果一个用户使用网站30m后，再去请求时会显示token失效
 * 我们的需求是用户不使用网站30m之后token失效，如果用户一直使用,那么token一直不失效
 * 所以当用户请求来时就刷新token的ttl
 *
 */
public class RefreshTokenInterceptor implements HandlerInterceptor {

    private StringRedisTemplate stringRedisTemplate;

    public RefreshTokenInterceptor(StringRedisTemplate stringRedisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token = request.getHeader("authorization");
        if(StrUtil.isBlank(token)){
            System.out.println("token is blank");
            return true;
        }
        String key = token;
        //将token字符串转化Map集合
        Map<String,Object> map = JwtUtil.parseToken(stringRedisTemplate.opsForValue().get(key));
        if (map.isEmpty()){
            System.out.println("map is empty");
            return true;
        }

        UserDTO userDTO = new UserDTO();
        //从map集合中取得相关key和值，并将其转化为UserDTO对象，并将UserDTO对象存入ThreadLocal对象中
        //当其他接口需要使用id,name,icon时，可以从ThreadLocal对象中取。
        //map.get("id")取的是Integer型,
        int id = (int) map.get("id");
        Long Lid = Long.valueOf(id);

        String userName = (String) map.get("userName");
        String icon = (String) map.get("icon");
        userDTO.setId(Lid);
        userDTO.setNickName(userName);
        userDTO.setIcon(icon);
        UserHolder.saveUser(userDTO);
        stringRedisTemplate.expire(key,1, TimeUnit.HOURS);
        return true;

    }
}
